home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / pack / xpk_Develop.lha / xpk_Develop / Include / C / xpk / xpkLibHeader.c < prev    next >
C/C++ Source or Header  |  1998-12-18  |  6KB  |  195 lines

  1. /*************** $VER: xpkLibHeader.c 1.3 (18.12.1998) ******************/
  2.  
  3. #include <exec/initializers.h>
  4. #include <exec/resident.h>
  5. #include <proto/exec.h>
  6. #include "SDI_compiler.h"
  7.  
  8. struct LibInitData {
  9.  UBYTE i_Type;     UBYTE o_Type;     UBYTE  d_Type;    UBYTE p_Type;
  10.  UBYTE i_Name;     UBYTE o_Name;     STRPTR d_Name;
  11.  UBYTE i_Flags;    UBYTE o_Flags;    UBYTE  d_Flags;    UBYTE p_Flags;
  12.  UBYTE i_Version;  UBYTE o_Version;  UWORD  d_Version;
  13.  UBYTE i_Revision; UBYTE o_Revision; UWORD  d_Revision;
  14.  UBYTE i_IdString; UBYTE o_IdString; STRPTR d_IdString;
  15.  ULONG endmark;
  16. };
  17.  
  18. /************************************************************************/
  19.  
  20. LONG ReturnError(void);
  21. LONG LibReserved(void);
  22. ASM(BPTR) LibExpunge(REG(a6, struct XpkSubBase *));
  23. ASM(BPTR) LibClose(REG(a6, struct XpkSubBase *));
  24. ASM(struct XpkSubBase *) LibOpen(REG(a6, struct XpkSubBase *));
  25. ASM(struct XpkSubBase *) LibInit(REG(a0, BPTR), REG(d0, struct XpkSubBase *),
  26.     REG(a6, struct ExecBase *));
  27.  
  28. /************************************************************************/
  29.  
  30. ASM(struct XpkInfo *) LIBXpksPackerInfo(void);
  31. ASM(LONG) LIBXpksPackChunk(REG(a0,struct XpkSubParams *),
  32.     REG(a6, struct XpkSubBase *));
  33. ASM(void) LIBXpksPackFree(REG(a0,struct XpkSubParams *),
  34.     REG(a6, struct xpkSubBase *));
  35. ASM(LONG) LIBXpksPackReset(REG(a0,struct XpkSubParams *),
  36.     REG(a6, struct XpkSubBase *));
  37. ASM(LONG) LIBXpksUnpackChunk(REG(a0,struct XpkSubParams *),
  38.     REG(a6, struct XpkSubBase *));
  39. ASM(void) LIBXpksUnpackFree(REG(a0,struct XpkSubParams *),
  40.     REG(a6, struct xpkSubBase *));
  41.  
  42. /************************************************************************/
  43.  
  44. /* First executable routine of this library; must return an error
  45.    to the unsuspecting caller */
  46. LONG ReturnError(void)
  47. {
  48.   return -1;
  49. }
  50.  
  51. /* The mandatory reserved library function */
  52. LONG LibReserved(void)
  53. {
  54.   return 0;
  55. }
  56.  
  57. /* Expunge the library, remove it from memory */
  58. ASM(BPTR) LibExpunge(REG(a6, struct XpkSubBase *XpkSubBase))
  59. {
  60.   BPTR Result = 0;
  61.  
  62.   /* Expunge it later */
  63.   XpkSubBase->xsb_LibNode.lib_Flags |= LIBF_DELEXP;
  64.  
  65.   /* Can we get away with this? */
  66.   if(!XpkSubBase->xsb_LibNode.lib_OpenCnt)
  67.   {
  68.     struct ExecBase *SysBase = XpkSubBase->xsb_SysBase;
  69.  
  70.     xExitCode(XpkSubBase);
  71.  
  72.     /* Remove the library from the public list */
  73.     Remove((struct Node *)XpkSubBase);
  74.  
  75.     /* Return the seglist, so it can be unloaded */
  76.     Result = XpkSubBase->xsb_SegList;
  77.  
  78.     /* Free the vector table and the library data */
  79.     FreeMem((STRPTR) XpkSubBase-XpkSubBase->xsb_LibNode.lib_NegSize,
  80.     XpkSubBase->xsb_LibNode.lib_NegSize+XpkSubBase->xsb_LibNode.lib_PosSize);
  81.   }
  82.  
  83.   /* Return the segment pointer, if any */
  84.   return Result;
  85. }
  86.  
  87. /* Close the library, as called by CloseLibrary() */
  88. ASM(BPTR) LibClose(REG(a6, struct XpkSubBase *XpkSubBase))
  89. {
  90.   BPTR Result = 0;
  91.  
  92.   if(!(--XpkSubBase->xsb_LibNode.lib_OpenCnt))
  93.   {
  94.     if(XpkSubBase->xsb_LibNode.lib_Flags & LIBF_DELEXP)
  95.       Result = LibExpunge(XpkSubBase);
  96.   }
  97.  
  98.   return Result;
  99. }
  100.  
  101. /* Open the library, as called via OpenLibrary() */
  102. ASM(struct XpkSubBase *) LibOpen(REG(a6, struct XpkSubBase *XpkSubBase))
  103. {
  104.   /* Prevent delayed expunge and increment opencnt */
  105.   XpkSubBase->xsb_LibNode.lib_Flags &= ~LIBF_DELEXP;
  106.   XpkSubBase->xsb_LibNode.lib_OpenCnt++;
  107.  
  108.   /* return base */
  109.   return XpkSubBase;
  110. }
  111.  
  112. /* Initialize the library */
  113. ASM(struct XpkSubBase *) LibInit(REG(a0, BPTR SegList),
  114. REG(d0, struct XpkSubBase *XpkSubBase), REG(a6, struct ExecBase *SysBase))
  115. {
  116.   /* Remember the segment pointer */
  117.   XpkSubBase->xsb_SegList = SegList;
  118.  
  119.   /* Remember the exec library base pointer */
  120.   XpkSubBase->xsb_SysBase = SysBase;
  121.  
  122.   if(xInitCode(XpkSubBase))
  123.   {
  124.     xExitCode(XpkSubBase);
  125.     /* Free the vector table and the library data */
  126.     FreeMem((STRPTR) XpkSubBase-XpkSubBase->xsb_LibNode.lib_NegSize,
  127.     XpkSubBase->xsb_LibNode.lib_NegSize+XpkSubBase->xsb_LibNode.lib_PosSize);
  128.     XpkSubBase = 0;
  129.   }
  130.   
  131.   return XpkSubBase;
  132. }
  133.  
  134. /************************************************************************/
  135.  
  136. /* This is the table of functions that make up the library. The first
  137.    four are mandatory, everything following it are user callable
  138.    routines. The table is terminated by the value -1. */
  139.  
  140. static const APTR LibVectors[20] = {
  141.   (APTR)LibOpen,
  142.   (APTR)LibClose,
  143.   (APTR)LibExpunge,
  144.   (APTR)LibReserved,
  145.   (APTR)LIBXpksPackerInfo,
  146.   (APTR)LIBXpksPackChunk,
  147.   (APTR)LIBXpksPackFree,
  148.   (APTR)LIBXpksPackReset,
  149.   (APTR)LIBXpksUnpackChunk,
  150.   (APTR)LIBXpksUnpackFree,
  151.   (APTR)-1
  152. };
  153.  
  154. static const struct LibInitData LibInitData = {
  155.  0xA0, (UBYTE) OFFSET(Node,    ln_Type),      NT_LIBRARY,         0,
  156.  0x80, (UBYTE) OFFSET(Node,    ln_Name),      LIBNAME,
  157.  0xA0, (UBYTE) OFFSET(Library, lib_Flags),    LIBF_SUMUSED|LIBF_CHANGED, 0,
  158.  0x90, (UBYTE) OFFSET(Library, lib_Version),  VERSION,
  159.  0x90, (UBYTE) OFFSET(Library, lib_Revision), REVISION,
  160.  0x80, (UBYTE) OFFSET(Library, lib_IdString), IDSTRING,
  161.  0
  162. };
  163.  
  164. /* The following data structures and data are responsible for
  165.    setting up the Library base data structure and the library
  166.    function vector. */
  167.  
  168. static const ULONG LibInitTable[4] = {
  169.   (ULONG)sizeof(struct XpkSubBase), /* Size of the base data structure */
  170.   (ULONG)LibVectors,             /* Points to the function vector */
  171.   (ULONG)&LibInitData,           /* Library base data structure setup table */
  172.   (ULONG)LibInit                 /* The address of the routine to do the setup */
  173. };
  174.  
  175. /************************************************************************/
  176.  
  177. /* The library loader looks for this marker in the memory
  178.    the library code and data will occupy. It is responsible
  179.    setting up the Library base data structure.
  180. */
  181.  
  182. static const struct Resident RomTag = {
  183.   RTC_MATCHWORD,                /* Marker value. */
  184.   (struct Resident *)&RomTag,   /* This points back to itself. */
  185.   (struct Resident *)&RomTag+1, /* This points behind this marker. */
  186.   RTF_AUTOINIT,                 /* The Library should be set up according to the given table. */
  187.   VERSION,                      /* The version of this Library. */
  188.   NT_LIBRARY,                   /* This defines this module as a Library. */
  189.   0,                            /* Initialization priority of this Library; unused. */
  190.   LIBNAME,                      /* Points to the name of the Library. */
  191.   IDSTRING,                     /* The identification string of this Library. */
  192.   (APTR)&LibInitTable           /* This table is for initializing the Library. */
  193. };
  194.  
  195.